package pe.com.hermes.hermetic.modelo.daoimpl;

import com.ibatis.sqlmap.client.SqlMapClient;

import java.sql.SQLException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Repository;

import pe.com.hermes.hermetic.modelo.dao.ProgPedidoDAO;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.ProgPediEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.managerimpl.PedidoAbstract;


@Repository("progPedidoDAO")
public class ProgPedidoDAOImpl implements ProgPedidoDAO {
    
  @Autowired
  protected JdbcTemplate jdbcTemplate;
  private Logger logger = Logger.getLogger(this.getClass());

  @Autowired
  private SqlMapClient sqlMapClient;   
    
  public int getExisProgPunt(int codPunt){
    Map map = new HashMap();
    map.put("P_COD_PUNT",codPunt);
    int exisProgPunt = 0;
    try{
        sqlMapClient.queryForObject("getExisProgPunt",map);
        exisProgPunt = (Integer)map.get("S_EXIS");
    }catch(Exception e){
        logger.error(e);
        exisProgPunt = 0;
    }finally{
      return exisProgPunt;      
    }
  }
  
  public int getExisParmProg(int codCliente, int codSucuHtb){
    Map map = new HashMap();
    map.put("P_COD_CLIE",codCliente);
    map.put("P_COD_SUCU_HTB",codSucuHtb);
    int exisParmProg = 0;
    try{
        sqlMapClient.queryForObject("getExisParmProg",map);
        exisParmProg = (Integer)map.get("S_EXIS");
    }catch(Exception e){
        logger.error(e);
        exisParmProg = 0;
    }finally{
      return exisParmProg;      
    }
  }
  
  public int saveProgPedi(ProgPediEntity progPedi, String usuModi, String compModi){
    Map map = new HashMap();
    map.put("P_NUM_PEDI", progPedi.getNumPedi());
    map.put("P_COD_SERI_PEDI",progPedi.getCodSeriPedi());
    map.put("P_TIP_DOCU_PEDI",progPedi.getTipDocuPedi());
    map.put("P_EST_PROG",progPedi.getEstProg());
    map.put("P_TIP_FREC", progPedi.getTipFrec());
    map.put("P_NUM_PROG_SEMA",progPedi.getNumProgSema());
    map.put("P_IND_DIAS",progPedi.getIndDias());
    map.put("P_FEC_INIC",progPedi.getFecIni());
    map.put("P_FEC_FINA", progPedi.getFecFin());
    map.put("P_COD_USUA",usuModi);
    map.put("P_NOM_COMP",compModi);
    int erro = 0;
    try{
        sqlMapClient.insert("saveProgPedi",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro!=0)
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
        erro = 1;
    }
    return erro;  
  }
  
  public int activarProgramacion(PedidoEntity pedido) {
    int erro = 0;
    Map map = new HashMap();
    map.put("P_TIP_DOCU_PEDI", pedido.getTipDocuPedi());
    map.put("P_COD_SERI_PEDI", pedido.getCodSeriPedi());
    map.put("P_NUM_PEDI", pedido.getNumPedi());
    map.put("P_NUM_PEDI_TEMP",  pedido.getNumPediTemp()==null?0:pedido.getNumPediTemp());
    map.put("P_COD_SERI_TEMP", pedido.getCodSeriPediTemp()==null?"":pedido.getCodSeriPediTemp());
    map.put("P_TIP_DOCU_TEMP", pedido.getTipDocuPediTemp()==null?"":pedido.getTipDocuPediTemp());
    try{
        sqlMapClient.update("activarProgramacion",map);
        erro = (Integer)map.get("S_ERRO");
        if(erro==1)
            throw new Exception(map.get("S_MENS").toString());
    }catch(Exception e){
        logger.error(e);
        erro=1;
    }
    return erro;
  }
  
  public List<PedidoAbstract> getPedidosProgramados(String cliente, String puntos, String sucursal, String tipOrig, 
                                                    String fechaDesde, String fechaHasta)throws SQLException{
    
    List<PedidoAbstract> list = new ArrayList<PedidoAbstract>();
    Map map = new HashMap();
    map.put("P_LIST_COD_CLIE",cliente);
    map.put("P_COD_SUCU_HTB",sucursal);
    map.put("P_LIST_COD_PUNT",puntos);
    map.put("P_TIP_ORIG",tipOrig);
    map.put("P_FEC_INIC",fechaDesde);
    map.put("P_FEC_FINA",fechaHasta);
    int erro = 0;
    sqlMapClient.queryForObject("getListPediProg",map);
    erro = (Integer)map.get("S_ERRO");
    if(erro==0)
        list=(List<PedidoAbstract>)map.get("S_LIST");
    else
        throw new SQLException(map.get("S_MENS").toString());
    return list;     
  }
  
  public int cancelarProgramacion(final String codProg){
      Map map = new HashMap();
      map.put("P_COD_PROG",Integer.parseInt(codProg));
      
      int erro = ConstantesHermetic.RESULT_SP_OK;
      try{
          sqlMapClient.update("cancelarProgrPedi",map);
          erro=(Integer)map.get("S_ERRO");
        if(erro==ConstantesHermetic.RESULT_SP_ERROR)
            throw new Exception(map.get("S_MENS").toString());
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
          erro= ConstantesHermetic.RESULT_SP_ERROR;
      }  
      return erro;
  }
  
  public List<ProgPediEntity> getProgramacionPedido(int codProg)throws SQLException{
    
    List<ProgPediEntity> list = new ArrayList<ProgPediEntity>();
    Map map = new HashMap();
    map.put("P_COD_PROG",codProg);
    int erro = 0;
    sqlMapClient.queryForObject("getListProgPedi",map);
    erro = (Integer)map.get("S_ERRO");
    if(erro==0)
        list=(List<ProgPediEntity>)map.get("S_LIST");
    else
        throw new SQLException(map.get("S_MENS").toString());
    return list;     
  }
  
  public int actuConfPedi(int codProg, String tipFrec, int numProgSema, String selDias, String fecIni, String fecFin,String usuModi,String address){
        Map map = new HashMap();
        map.put("P_COD_PROG",codProg);
        map.put("P_TIP_FREC",tipFrec);
        map.put("P_NUM_PROG_SEMA",numProgSema);
        map.put("P_SEL_DIAS",selDias);
        map.put("P_FEC_INI",fecIni);
        map.put("P_FEC_FINA",fecFin);
        map.put("P_COD_USUA",usuModi);
        map.put("P_NOM_COMP",address);
        int erro = 0;
        try{
            sqlMapClient.update("actuConfPedi",map);
            erro = (Integer)map.get("S_ERRO");
            if(erro!=0)
                throw new Exception(map.get("S_MENS").toString());
        }catch(Exception e){
            logger.error(e);
            erro = ConstantesHermetic.RESULT_SP_ERROR;
        }
        return erro;    
  }
  
}
